λμ©λ λ€μ΄λ‘λλ₯Ό μν ν¨μ¨μ μΈ νλ‘ νΈμλ λ°±κ·ΈλΌμ΄λ νμΉ κ΅¬ν λ°©λ²μ λ°°μ보μΈμ. μ μΈκ³ μΉ μ ν리μΌμ΄μ μμ μνν μ¬μ©μ κ²½νκ³Ό μ΅μ μ μ±λ₯μ 보μ₯ν©λλ€.
νλ‘ νΈμλ λ°±κ·ΈλΌμ΄λ νμΉ: λμ©λ λ€μ΄λ‘λ κ΄λ¦¬ λ§μ€ν°νκΈ°
μ€λλ μ μΉ μ ν리μΌμ΄μ μμ μ¬μ©μλ€μ λμ©λ λ€μ΄λ‘λλ₯Ό μ²λ¦¬ν λμλ μννκ³ μλ΅μ±μ΄ λ°μ΄λ κ²½νμ κΈ°λν©λλ€. ν¨μ¨μ μΈ λ°±κ·ΈλΌμ΄λ νμΉ λ©μ»€λμ¦μ ꡬννλ κ²μ κΈμ μ μΈ μ¬μ©μ κ²½νμ μ 곡νκ³ μ ν리μΌμ΄μ μ±λ₯μ μ΅μ ννλ λ° λ§€μ° μ€μν©λλ€. μ΄ κ°μ΄λλ λμ©λ λ€μ΄λ‘λ κ΄λ¦¬λ₯Ό μν νλ‘ νΈμλ λ°±κ·ΈλΌμ΄λ νμΉ κΈ°μ μ λν ν¬κ΄μ μΈ κ°μλ₯Ό μ 곡νμ¬, νμΌ ν¬κΈ°λ λ€νΈμν¬ μνμ κ΄κ³μμ΄ μ ν리μΌμ΄μ μ μλ΅μ±κ³Ό μ¬μ©μ μΉνμ±μ μ μ§ν μ μλλ‘ λ³΄μ₯ν©λλ€.
λ°±κ·ΈλΌμ΄λ νμΉκ° μ€μν μ΄μ
μ¬μ©μκ° λ€μ΄λ‘λλ₯Ό μμνλ©΄ λΈλΌμ°μ λ μΌλ°μ μΌλ‘ ν¬κ·ΈλΌμ΄λμμ μμ²μ μ²λ¦¬ν©λλ€. μ΄λ μ¬λ¬ κ°μ§ λ¬Έμ λ‘ μ΄μ΄μ§ μ μμ΅λλ€:
- UI λ©μΆ€ νμ: λΈλΌμ°μ μ λ©μΈ μ€λ λκ° μ°¨λ¨λμ΄ μ¬μ©μ μΈν°νμ΄μ€κ° λ©μΆκ±°λ μλ΅νμ§ μμ μ μμ΅λλ€.
- λμ μ¬μ©μ κ²½ν: μ¬μ©μλ μ§μ°κ³Ό λΆνΈν¨μ κ²ͺκ² λμ΄ μ ν리μΌμ΄μ μ λν λΆμ μ μΈ μΈμμ κ°κ² λ μ μμ΅λλ€.
- λ€νΈμν¬ λ³λͺ© νμ: μ¬λ¬ λμ λ€μ΄λ‘λλ μ¬μ©μμ λμνμ ν¬νμμΌ μ λ°μ μΈ λ€νΈμν¬ μ±λ₯μ μν₯μ μ€ μ μμ΅λλ€.
- λ€μ΄λ‘λ μ€λ¨: μ¬μ©μκ° λΈλΌμ°μ νμ λ«κ±°λ λ€λ₯Έ νμ΄μ§λ‘ μ΄λνλ©΄ λ€μ΄λ‘λκ° μ€λ¨λμ΄ μ²μλΆν° λ€μ μμν΄μΌ ν μ μμ΅λλ€.
λ°±κ·ΈλΌμ΄λ νμΉλ λ€μ΄λ‘λκ° λ³λμ μ€λ λμμ λ°μνλλ‘ νμ¬ μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκ³ , λ©μΈ μ€λ λμ λ―ΈμΉλ μν₯μ μ΅μννλ©° μ λ°μ μΈ μ¬μ©μ κ²½νμ κ°μ ν©λλ€.
ν΅μ¬ κ°λ λ° κΈ°μ
νλ‘ νΈμλ λ°±κ·ΈλΌμ΄λ νμΉλ₯Ό ꡬννλ λ° μ¬μ©ν μ μλ λͺ κ°μ§ κΈ°μ κ³Ό κΈ°λ²μ΄ μμ΅λλ€:
1. μλΉμ€ μ컀 (Service Workers)
μλΉμ€ μ컀λ λ©μΈ λΈλΌμ°μ μ€λ λμ λ³λλ‘ λ°±κ·ΈλΌμ΄λμμ μ€νλλ μλ°μ€ν¬λ¦½νΈ νμΌμ λλ€. μΉ μ ν리μΌμ΄μ κ³Ό λ€νΈμν¬ μ¬μ΄μ νλ‘μ μν μ νμ¬ μ€νλΌμΈ μ§μ, νΈμ μλ¦Ό, λ°±κ·ΈλΌμ΄λ λκΈ°νμ κ°μ κΈ°λ₯μ κ°λ₯νκ² ν©λλ€. μλΉμ€ μ컀λ νλμ μΈ λ°±κ·ΈλΌμ΄λ νμΉ κ΅¬νμ μ΄μμ λλ€.
μμ: μλΉμ€ μ컀 λ±λ‘νκΈ°
```javascript if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/service-worker.js') .then(registration => { console.log('μλΉμ€ μμ»€κ° λ€μ λ²μμ λ±λ‘λμμ΅λλ€:', registration.scope); }) .catch(error => { console.error('μλΉμ€ μ컀 λ±λ‘ μ€ν¨:', error); }); } ```
2. μ€νΈλ¦Ό API (Streams API)
μ€νΈλ¦Ό APIλ λ°μ΄ν°κ° μ¬μ© κ°λ₯ν΄μ§λ λλ‘ μ μ§μ μΌλ‘ μ²λ¦¬νλ λ°©λ²μ μ 곡ν©λλ€. μ΄λ μ 체 νμΌμ ν λ²μ λ©λͺ¨λ¦¬μ λ‘λνλ λμ λ°μ΄ν°λ₯Ό μ²ν¬(chunk) λ¨μλ‘ μ²λ¦¬ν μ μκ² ν΄μ£Όλ―λ‘ λμ©λ λ€μ΄λ‘λμ νΉν μ μ©ν©λλ€.
μμ: μ€νΈλ¦Ό APIλ₯Ό μ¬μ©νμ¬ λ°μ΄ν° λ€μ΄λ‘λ λ° μ²λ¦¬νκΈ°
```javascript fetch('/large-file.zip') .then(response => { const reader = response.body.getReader(); let receivedLength = 0; let chunks = []; return new Promise((resolve, reject) => { function pump() { reader.read().then(({ done, value }) => { if (done) { resolve(chunks); return; } chunks.push(value); receivedLength += value.length; console.log(receivedLength, 'λ°μ΄νΈ μμ '); pump(); }).catch(reject); } pump(); }); }) .then(chunks => { // λ€μ΄λ‘λλ μ²ν¬ μ²λ¦¬ console.log('λ€μ΄λ‘λ μλ£!', chunks); }) .catch(error => { console.error('λ€μ΄λ‘λ μ€ν¨:', error); }); ```
3. `fetch()` API
`fetch()` APIλ `XMLHttpRequest`λ₯Ό λ체νλ νλμ μΈ λ°©λ²μΌλ‘, λ€νΈμν¬ μμ²μ λ μ μ°νκ³ κ°λ ₯νκ² λ§λλ λ°©λ²μ μ 곡ν©λλ€. μμ² λ° μλ΅ μ€νΈλ¦Όκ³Ό κ°μ κΈ°λ₯μ μ§μνμ¬ λ°±κ·ΈλΌμ΄λ νμΉ μλ리μ€μ μ΄μμ μ λλ€.
4. λ°±κ·ΈλΌμ΄λ νμΉ API (Background Fetch API) (μ€νμ κΈ°λ₯)
λ°±κ·ΈλΌμ΄λ νμΉ APIλ λ°±κ·ΈλΌμ΄λμμ λμ©λ λ€μ΄λ‘λλ₯Ό μ²λ¦¬νκΈ° μν΄ νΉλ³ν μ€κ³λ μ μ© APIμ λλ€. λ€μ΄λ‘λλ₯Ό κ΄λ¦¬νκ³ , μ§ν μν©μ μΆμ νλ©°, μ€λ¨μ μ²λ¦¬νλ νμ€νλ λ°©λ²μ μ 곡ν©λλ€. κ·Έλ¬λ μ΄ APIλ μμ§ μ€ν λ¨κ³μ΄λ©° λͺ¨λ λΈλΌμ°μ μμ μ§μλμ§ μμ μ μλ€λ μ μ μ μν΄μΌ ν©λλ€. νΈνμ±μ 보μ₯νκΈ° μν΄ ν΄λ¦¬ν(polyfill)κ³Ό κΈ°λ₯ κ°μ§(feature detection)λ₯Ό μ¬μ©νλ κ²μ κ³ λ €νμΈμ.
λ°±κ·ΈλΌμ΄λ νμΉ κ΅¬ννκΈ°: λ¨κ³λ³ κ°μ΄λ
μλΉμ€ μ컀μ μ€νΈλ¦Ό APIλ₯Ό μ¬μ©νμ¬ λ°±κ·ΈλΌμ΄λ νμΉλ₯Ό ꡬννλ λ¨κ³λ³ κ°μ΄λλ λ€μκ³Ό κ°μ΅λλ€:
1λ¨κ³: μλΉμ€ μ컀 λ±λ‘
`service-worker.js` νμΌμ μμ±νκ³ λ©μΈ μλ°μ€ν¬λ¦½νΈ νμΌμ λ±λ‘ν©λλ€(μ μμ μ°Έμ‘°).
2λ¨κ³: μλΉμ€ μ컀μμ νμΉ μμ² κ°λ‘μ±κΈ°
`service-worker.js` νμΌ λ΄μμ `fetch` μ΄λ²€νΈλ₯Ό μμ νκ³ λμ©λ νμΌμ λν μμ²μ κ°λ‘μ±λλ€. μ΄λ₯Ό ν΅ν΄ λ°±κ·ΈλΌμ΄λμμ λ€μ΄λ‘λλ₯Ό μ²λ¦¬ν μ μμ΅λλ€.
```javascript self.addEventListener('fetch', event => { if (event.request.url.includes('/large-file.zip')) { event.respondWith(handleBackgroundFetch(event.request)); } }); async function handleBackgroundFetch(request) { try { const response = await fetch(request); // Streams APIλ₯Ό μ¬μ©νμ¬ μλ΅ μ²λ¦¬ const reader = response.body.getReader(); // ... (μ€νΈλ¦Όμ μ²λ¦¬νκ³ λ°μ΄ν° μ μ₯) return new Response('λ€μ΄λ‘λ μ§ν μ€', { status: 202 }); // μλ½λ¨ } catch (error) { console.error('λ°±κ·ΈλΌμ΄λ νμΉ μ€ν¨:', error); return new Response('λ€μ΄λ‘λ μ€ν¨', { status: 500 }); // λ΄λΆ μλ² μ€λ₯ } } ```
3λ¨κ³: μ€νΈλ¦Ό μ²λ¦¬ λ° λ°μ΄ν° μ μ₯
`handleBackgroundFetch` ν¨μ λ΄μμ μ€νΈλ¦Ό APIλ₯Ό μ¬μ©νμ¬ μλ΅ λ³Έλ¬Έμ μ²ν¬ λ¨μλ‘ μ½μ΅λλ€. κ·Έλ° λ€μ λμ€μ κ²μν μ μλλ‘ μ΄ μ²ν¬λ€μ IndexedDBλ νμΌ μμ€ν μ κ·Ό API(μ¬μ© κ°λ₯ν κ²½μ°)μ κ°μ λ‘컬 μ μ₯μ λ©μ»€λμ¦μ μ μ₯ν μ μμ΅λλ€. λ¨μνλ IndexedDB μνΈ μμ©μ μν΄ `idb`μ κ°μ λΌμ΄λΈλ¬λ¦¬ μ¬μ©μ κ³ λ €ν΄ λ³΄μΈμ.
```javascript // IndexedDB μ¬μ© μμ ('idb'μ κ°μ IndexedDB λΌμ΄λΈλ¬λ¦¬ νμ) import { openDB } from 'idb'; async function handleBackgroundFetch(request) { try { const response = await fetch(request); const reader = response.body.getReader(); const db = await openDB('my-download-db', 1, { upgrade(db) { db.createObjectStore('chunks'); } }); let chunkIndex = 0; while (true) { const { done, value } = await reader.read(); if (done) { break; } await db.put('chunks', value, chunkIndex); chunkIndex++; // UIμ μ§νλ₯ μ λ°μ΄νΈ μ μ‘ (μ ν μ¬ν) self.clients.matchAll().then(clients => { clients.forEach(client => client.postMessage({ type: 'download-progress', progress: chunkIndex })); }); } await db.close(); return new Response('λ€μ΄λ‘λ μλ£', { status: 200 }); // μ±κ³΅ } catch (error) { console.error('λ°±κ·ΈλΌμ΄λ νμΉ μ€ν¨:', error); return new Response('λ€μ΄λ‘λ μ€ν¨', { status: 500 }); } } ```
4λ¨κ³: νμΌ μ¬μ‘°λ¦½
λͺ¨λ μ²ν¬κ° λ€μ΄λ‘λλκ³ μ μ₯λλ©΄ μ΄λ₯Ό μλ³Έ νμΌλ‘ μ¬μ‘°λ¦½ν μ μμ΅λλ€. IndexedDB(λλ μ νν μ μ₯μ λ©μ»€λμ¦)μμ μ¬λ°λ₯Έ μμλ‘ μ²ν¬λ₯Ό κ²μνκ³ κ²°ν©ν©λλ€.
```javascript async function reassembleFile() { const db = await openDB('my-download-db', 1); const tx = db.transaction('chunks', 'readonly'); const store = tx.objectStore('chunks'); let chunks = []; let cursor = await store.openCursor(); while (cursor) { chunks.push(cursor.value); cursor = await cursor.continue(); } await tx.done; await db.close(); // μ²ν¬λ€μ λ¨μΌ BlobμΌλ‘ κ²°ν© const blob = new Blob(chunks); // λ€μ΄λ‘λ λ§ν¬ μμ± const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'downloaded-file.zip'; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); } ```
5λ¨κ³: λ€μ΄λ‘λ μ§νλ₯ νμ
λ€μ΄λ‘λ μ§νλ₯ μ νμνμ¬ μ¬μ©μμκ² μκ°μ νΌλλ°±μ μ 곡ν©λλ€. `postMessage` APIλ₯Ό μ¬μ©νμ¬ μλΉμ€ μ컀μμ λ©μΈ μ€λ λλ‘ μ§νλ₯ μ λ°μ΄νΈλ₯Ό λ³΄λΌ μ μμ΅λλ€.
```javascript // μλΉμ€ μ컀μμ (3λ¨κ³μμ 보μ¬μ€ κ²μ²λΌ): self.clients.matchAll().then(clients => { clients.forEach(client => client.postMessage({ type: 'download-progress', progress: chunkIndex })); }); // λ©μΈ μ€λ λμμ: navigator.serviceWorker.addEventListener('message', event => { if (event.data.type === 'download-progress') { const progress = event.data.progress; // UIμ μ§νλ₯ νμμ€ μ λ°μ΄νΈ console.log('λ€μ΄λ‘λ μ§νλ₯ :', progress); } }); ```
κ³ κΈ κΈ°μ λ° κ³ λ € μ¬ν
1. μ΄μ΄λ°κΈ° λ€μ΄λ‘λ (Resumable Downloads)
μ¬μ©μκ° μ€λ¨λ λ€μ΄λ‘λλ₯Ό μ¬κ°ν μ μλλ‘ μ΄μ΄λ°κΈ° λ€μ΄λ‘λλ₯Ό ꡬννμΈμ. μ΄λ `fetch` μμ²μ `Range` ν€λλ₯Ό μ¬μ©νμ¬ λ€μ΄λ‘λνλ €λ νμΌμ λΆλΆμ μ§μ ν¨μΌλ‘μ¨ λ¬μ±ν μ μμ΅λλ€. μ΄λ₯Ό μν΄μλ μλ²κ° λ²μ μμ²(range requests)μ μ§μν΄μΌ ν©λλ€.
```javascript // μ΄μ΄λ°κΈ° λ€μ΄λ‘λ μμ async function resumableDownload(url, startByte = 0) { const response = await fetch(url, { headers: { 'Range': `bytes=${startByte}-` } }); if (response.status === 206) { // λΆλΆ μ½ν μΈ // ... μλ΅ μ€νΈλ¦Όμ μ²λ¦¬νκ³ κΈ°μ‘΄ νμΌμ μΆκ° } else { // μ€λ₯λ₯Ό μ²λ¦¬νκ±°λ μ²μλΆν° λ€μ μμ } } ```
2. μ€λ₯ μ²λ¦¬ λ° μ¬μλ λ©μ»€λμ¦
λ€νΈμν¬ μ€λ₯ λ° κΈ°ν λ¬Έμ λ₯Ό μννκ² μ²λ¦¬νκΈ° μν΄ κ°λ ₯ν μ€λ₯ μ²λ¦¬ κΈ°λ₯μ ꡬννμΈμ. μ€ν¨ν λ€μ΄λ‘λλ₯Ό μλμΌλ‘ μ¬μλνκΈ° μν΄ μ§μμ λ°±μ€ν(exponential backoff)λ₯Ό μ¬μ©νλ μ¬μλ λ©μ»€λμ¦μ κ³ λ €ν΄ λ³΄μΈμ.
3. μΊμ± μ λ΅
λΆνμν λ€μ΄λ‘λλ₯Ό νΌνκΈ° μν΄ μΊμ± μ λ΅μ ꡬννμΈμ. μλΉμ€ μ컀μ μΊμ API(Cache API)λ₯Ό μ¬μ©νμ¬ λ€μ΄λ‘λλ νμΌμ μ μ₯νκ³ μ¬μ© κ°λ₯ν λ μΊμμμ μ 곡ν μ μμ΅λλ€. μ ν리μΌμ΄μ μ νμμ λ°λΌ "μΊμ μ°μ , κ·Έ λ€μ λ€νΈμν¬" λλ "λ€νΈμν¬ μ°μ , κ·Έ λ€μ μΊμ"μ κ°μ μ λ΅ μ¬μ©μ κ³ λ €ν΄ λ³΄μΈμ.
4. λ€μ΄λ‘λ μ°μ μμ μ§μ
μ ν리μΌμ΄μ μ΄ μ¬λ¬ λμ λ€μ΄λ‘λλ₯Ό νμ©νλ κ²½μ°, κ°μ₯ μ€μν λ€μ΄λ‘λκ° λ¨Όμ μλ£λλλ‘ μ°μ μμ μ§μ λ©μ»€λμ¦μ ꡬννλ κ²μ κ³ λ €ν΄ λ³΄μΈμ. ν(queue)λ₯Ό μ¬μ©νμ¬ λ€μ΄λ‘λλ₯Ό κ΄λ¦¬νκ³ μ¬μ©μ μ νΈλλ κΈ°ν κΈ°μ€μ λ°λΌ μ°μ μμλ₯Ό μ§μ ν μ μμ΅λλ€.
5. 보μ κ³ λ € μ¬ν
보μ μ·¨μ½μ μ λ°©μ§νκΈ° μν΄ νμ λ€μ΄λ‘λλ νμΌμ κ²μ¦νμΈμ. νμΌμ΄ λΈλΌμ°μ μμ μ¬λ°λ₯΄κ² μ²λ¦¬λλλ‘ μ μ ν νμΌ νμ₯μμ MIME μ νμ μ¬μ©νμΈμ. μ½ν μΈ λ³΄μ μ μ± (CSP)μ μ¬μ©νμ¬ μ ν리μΌμ΄μ μμ λ‘λν μ μλ 리μμ€ μ νμ μ ννλ κ²μ κ³ λ €ν΄ λ³΄μΈμ.
6. κ΅μ ν λ° νμ§ν
λ€μ΄λ‘λ κ΄λ¦¬ μμ€ν μ΄ κ΅μ ν λ° νμ§νλ₯Ό μ§μνλμ§ νμΈνμΈμ. μ§νλ₯ λ©μμ§μ μ€λ₯ λ©μμ§λ₯Ό μ¬μ©μκ° μ νΈνλ μΈμ΄λ‘ νμνμΈμ. λ€μν νμΌ μΈμ½λ©κ³Ό λ¬Έμ μ§ν©μ μ¬λ°λ₯΄κ² μ²λ¦¬νμΈμ.
μμ: κΈλ‘λ² μ΄λ¬λ νλ«νΌ
λ€μ΄λ‘λ κ°λ₯ν κ°μ μλ£(PDF, λΉλμ€ λ±)λ₯Ό μ 곡νλ κΈλ‘λ² μ΄λ¬λ νλ«νΌμ μμν΄ λ³΄μΈμ. λ°±κ·ΈλΌμ΄λ νμΉλ₯Ό μ¬μ©νμ¬ μ΄ νλ«νΌμ λ€μκ³Ό κ°μ μμ μ μνν μ μμ΅λλ€:
- μΈν°λ· μ°κ²°μ΄ λΆμμ ν μ§μ(μ: κ°λ°λμκ΅μ μ골 μ§μ)μ νμλ€μ΄ κ°νμ μΈ μ°κ²° μνμμλ μ½ν μΈ λ₯Ό κ³μ λ€μ΄λ‘λν μ μλλ‘ ν©λλ€. μ¬κΈ°μλ μ΄μ΄λ°κΈ° λ€μ΄λ‘λκ° λ§€μ° μ€μν©λλ€.
- λμ©λ λΉλμ€ κ°μκ° λ€μ΄λ‘λλλ λμ UIκ° λ©μΆλ κ²μ λ°©μ§νμ¬ μνν νμ΅ κ²½νμ 보μ₯ν©λλ€.
- μ¬μ©μμκ² λ€μ΄λ‘λ μ°μ μμλ₯Ό μ§μ ν μ μλ μ΅μ μ μ 곡ν©λλ€. μλ₯Ό λ€μ΄, μ νμ μΈ λ³΄μΆ© μλ£λ³΄λ€ μ΄λ² μ£Ό κ°μ μλ£λ₯Ό μ°μ μν μ μμ΅λλ€.
- λ€μν λ€νΈμν¬ μλμ μλμΌλ‘ μ μνμ¬ μ±λ₯μ μ΅μ ννκΈ° μν΄ λ€μ΄λ‘λ μ²ν¬ ν¬κΈ°λ₯Ό μ‘°μ ν©λλ€.
λΈλΌμ°μ νΈνμ±
μλΉμ€ μ컀λ λλΆλΆμ μ΅μ λΈλΌμ°μ μμ λ리 μ§μλ©λλ€. κ·Έλ¬λ μΌλΆ ꡬν λΈλΌμ°μ λ μ§μνμ§ μμ μ μμ΅λλ€. κΈ°λ₯ κ°μ§λ₯Ό μ¬μ©νμ¬ μλΉμ€ μ컀 μ§μ μ¬λΆλ₯Ό νμΈνκ³ κ΅¬ν λΈλΌμ°μ λ₯Ό μν λ체 λ©μ»€λμ¦μ μ 곡νμΈμ. λ°±κ·ΈλΌμ΄λ νμΉ APIλ μμ§ μ€ν λ¨κ³μ΄λ―λ‘ λ λμ νΈνμ±μ μν΄ ν΄λ¦¬ν μ¬μ©μ κ³ λ €νμΈμ.
κ²°λ‘
λμ©λ λ€μ΄λ‘λλ₯Ό μν ν¨μ¨μ μΈ νλ‘ νΈμλ λ°±κ·ΈλΌμ΄λ νμΉλ₯Ό ꡬννλ κ²μ νλ μΉ μ ν리μΌμ΄μ μμ μνν μ¬μ©μ κ²½νμ μ 곡νλ λ° νμμ μ λλ€. μλΉμ€ μ컀, μ€νΈλ¦Ό API, `fetch()` APIμ κ°μ κΈ°μ μ νμ©νμ¬ λμ©λ νμΌμ μ²λ¦¬ν λμλ μ ν리μΌμ΄μ μ μλ΅μ±κ³Ό μ¬μ©μ μΉνμ±μ μ μ§ν μ μμ΅λλ€. μ±λ₯μ μ΅μ ννκ³ κ°λ ₯νκ³ μ λ’°ν μ μλ λ€μ΄λ‘λ κ΄λ¦¬ μμ€ν μ μ 곡νκΈ° μν΄ μ΄μ΄λ°κΈ° λ€μ΄λ‘λ, μ€λ₯ μ²λ¦¬, μΊμ± μ λ΅κ³Ό κ°μ κ³ κΈ κΈ°μ μ κ³ λ €νλ κ²μ μμ§ λ§μΈμ. μ΄λ¬ν μΈ‘λ©΄μ μ§μ€ν¨μΌλ‘μ¨ μ¬μ©μμ μμΉλ λ€νΈμν¬ μνμ κ΄κ³μμ΄ λ λ§€λ ₯μ μ΄κ³ λ§μ‘±μ€λ¬μ΄ κ²½νμ μ 곡νκ³ μ§μ ν κΈλ‘λ² μ ν리μΌμ΄μ μ λ§λ€ μ μμ΅λλ€.